# -*- coding: utf-8 -*-

# === システム全体で利用する汎用メソッドをまとめたモジュール
module CommonUtils
  # === システム全体で用いる各種正規表現を保持する定数
  REG_EXPS = {:email_format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i}

  # === routes.rbで指定できるものと同じ形式でURLを生成する
  def url(url_string)
    t_cntl, t_act = url_string.split('#')
    return url_for :controller => t_cntl, :action => t_act
  end

  # === 引数で指定されたルーティングが実在するかどうかを真偽値で返す
  def route_exist?(url)
    all_routes = Rails.application.routes.routes
    flag = false
    all_routes.each do |route|
      reqs = route.requirements.dup
      reqs[:to] = route.app unless route.app.class.name.to_s =~ /^ActionDispatch::Routing/
      reqs = reqs.empty? ? "" : reqs.inspect

      if url.is_a?(String)
        flag = true if route.path =~ /#{url}/
      elsif url.is_a?(Symbol)
        flag = true if self.methods.include?(url)
      elsif url.is_a?(Hash)
        flag = true if url[:controller] == reqs[:controller] && url[:action] == reqs[:action]
      end
    end
    return flag
  end

  # === 引数で指定されたルーティングが実在すればリンクを返し、実在しなければ
  # 単にその文字列を返す
  def ext_link_to(str, url, args = nil, opt = {})
    if route_exist?(url)
      if args
        url = self.__send__(url, args)
      else
        url = self.__send__(url)
      end
      return link_to(str, url, opt)
    else
      return false
    end
  end

  # === パーミッション検証用メソッド
  # 第一引数のターゲットに対して第二引数のユーザーが許可を持つかどうかを
  # 真偽値で返す。Userモデルにincludeして使う場合を前提としている。
  def permisson?(target, user)
    case target
    when "friends"
      return false unless user
      return true if user.friend?(self.user)
    when "members"
      return true if user.is_a?(User)
    when "all"
      return true
    end
    return false
  end

  # === 招待メールの招待コードなどに使うランダムな文字列を生成して返す
  def create_random_string(length = 32)
    srand(Time.now.to_i)
    source = ("a".."z").to_a + ("A".."Z").to_a + (0..9).to_a + ["_","-","."]
    key = ""
    length.times { key += source[rand(source.size)].to_s }
    return key
  end
end

